package Videojuego;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Entorno extends JPanel implements ActionListener {

	private Timer timer;
	private NavEspacial craft;
	private Enemigo enemigo;
	private ArrayList<Alien> aliens;
	private ArrayList<Fuego> fuego;
	private boolean juego;
	private int anchoBorde;
	private int largoBorde;
	private String cadena = "spaceBackground.png";
	private int puntaje = 0;
	Image image;
	private boolean bandera = false;
	private Random rm = new Random();

	private int[][] pos = new int[27][2];

	private int[][] posFuego = { { 2380, 29 }, { 2500, 59 }, { 1380, 89 },
			{ 780, 109 }, { 580, 139 }, { 680, 239 }, { 790, 259 },
			{ 760, 50 }, { 790, 150 }, { 980, 209 }, { 560, 45 }, { 510, 70 },
			{ 930, 159 }, { 590, 80 }, { 530, 60 }, { 940, 59 }, { 990, 30 },
			{ 920, 200 }, { 900, 259 }, { 660, 50 }, { 540, 90 }, { 810, 220 },
			{ 860, 20 }, { 740, 180 }, { 820, 128 }, { 490, 170 }, { 700, 30 } };

	public Entorno() {

		addKeyListener(new Adaptador());
		setFocusable(true); // para permitir la escucha
		setDoubleBuffered(true); // buffer para pintar en pantalla
		juego = true;
		setSize(600, 400);
		craft = new NavEspacial();
		cargarAliens();
		timer = new Timer(5, this);
		timer.start();
		enemigo = new Enemigo();
		cargarDisparoEnemigo();
	}

	// cargar una imagen de fondo en el JFrame:
	public void paintComponent(Graphics g) {

		ImageIcon imagen = new ImageIcon(getClass().getResource(cadena));
		g.drawImage(imagen.getImage(), 0, 0, 800, 500, null);
		setOpaque(false);
		super.paintComponent(g);

	}

	// escucha mediante el teclado:
	public void addNotify() {
		super.addNotify();
		anchoBorde = getWidth();
		largoBorde = getHeight();
	}

	public void cargarAliens() {
		int posicion = 0;
		int posicion2 = 0;
		int contador = 0;
		aliens = new ArrayList<Alien>();
		for (int i = 0; i < 27; i++) {
			for (int j = 0; j < 2; j++) {
				posicion = rm.nextInt(1500 + 1);
				posicion2 = rm.nextInt(300 + 1);
				if (contador == 0) {
					if (posicion <= 40)
						posicion *= 4;
					pos[i][j] = posicion;
					contador++;
				} else {
					if (posicion2 <= 80)
						posicion2 *= 3;
					pos[i][j] = posicion2;
					contador = 0;
				}
			}
		}

		for (int i = 0; i < pos.length; i++) {
			aliens.add(new Alien(pos[i][0], pos[i][1]));
		}
	}

	public void cargarDisparoEnemigo() {

		fuego = new ArrayList<Fuego>();

		for (int elementoFuego = 0; elementoFuego < posFuego.length; elementoFuego++) {
			fuego.add(new Fuego(posFuego[elementoFuego][0],
					posFuego[elementoFuego][1]));
		}
	}

	public void puntaje(Graphics2D g){
		g.setColor(Color.WHITE);
		g.drawString("Puntaje:" + Integer.toString(puntaje),30,30);
	}
	
	public void paint(Graphics g) {
		super.paint(g);

		if (juego) {

			if (!bandera) {

				Graphics2D g2d = (Graphics2D) g; // cast de g

				if (craft.isVisible())
					g2d.drawImage(craft.getImagen(), craft.getPosicionX(),
							craft.getPosicionY(), this);

				ArrayList<Misil> misiles = craft.misiles();

				for (int i = 0; i < misiles.size(); i++) {
					Misil m = (Misil) misiles.get(i);
					g2d.drawImage(m.getImagen(), m.getPosicionX(),
							m.getPosicionY(), this);
				}

				for (int i = 0; i < aliens.size(); i++) {
					Alien a = (Alien) aliens.get(i);
					if (a.isVisible())
						g2d.drawImage(a.getImagen(), a.getPosicionX(),
								a.getPosicionY(), this);
				}

				g2d.setColor(Color.WHITE);
				g2d.drawString("Restantes para enemigo: " + aliens.size(), 5, 15);
				puntaje(g2d);
				
				if (aliens.size() == 0)
					bandera = true;
			}

			if (bandera) {
				Graphics2D g2dE = (Graphics2D) g;
				g2dE.drawImage(enemigo.conseguirImagen(), 90, 50, this);
				
				ArrayList <Misil> misiles = craft.misiles();
				
				for (int i = 0; i < misiles.size(); i++) {
					Misil m = (Misil) misiles.get(i);
					g2dE.drawImage(m.getImagen(), m.getPosicionX(),
							m.getPosicionY(), this);
				}

				for (int i = 0; i < fuego.size(); i++) {
					Fuego f = (Fuego) fuego.get(i);
					if (craft.isVisible())
						g2dE.drawImage(craft.getImagen(), craft.getPosicionX(),
								craft.getPosicionY(), this);
					if (f.isVisible())
						g2dE.drawImage(f.getImagen(), f.getPosicionX(),
								f.getPosicionY(), this);
				}
				
				puntaje(g2dE);
			}
		}

		else {

			String mensajeFinal = "FIN DEL JUEGO";
			String cadena = "Tu puntaje fue " + Integer.toString(puntaje);
			Font fuenteTipo = new Font("Helvetica", Font.BOLD, 14);
			FontMetrics fuente = this.getFontMetrics(fuenteTipo);
			g.setColor(Color.white);
			g.setFont(fuenteTipo);
			g.drawString(mensajeFinal,
					(anchoBorde - fuente.stringWidth(mensajeFinal)) / 2,largoBorde / 2);
			g.drawString(cadena, (anchoBorde - fuente.stringWidth(cadena)) / 2,largoBorde / 4);
		}
		// mantiene en sincroniia lo que se dibuja en la pantalla, actualizando
		// el buffer que permite esto
		Toolkit.getDefaultToolkit().sync();
		g.dispose(); // para borrar de memoria
	}

	public void actionPerformed(ActionEvent e) {

		if (aliens.size() == 0 && fuego.size() == 0) {
			juego = false;
		}

		ArrayList<Misil> misiles = craft.misiles();

		for (int i = 0; i < misiles.size(); i++) {
			Misil m = (Misil) misiles.get(i);
			if (m.isVisible())
				m.mover ();
			else
				misiles.remove(i);
		}

		for (int i = 0; i < aliens.size(); i++) {
			Alien a = (Alien) aliens.get(i);
			if (a.isVisible())
				a.mover();
			else
				aliens.remove(i);
		}

		if (bandera) {

			for (int k = 0; k < fuego.size(); k++) {
				Fuego f = (Fuego) fuego.get(k);
				if (f.isVisible())
					f.mover();
				else
					fuego.remove(k);
			}
		}

		craft.mover();
		colisiones();
		repaint();
	}

	public void colisiones() {

		Rectangle r3 = craft.colisiones_();

		for (int j = 0; j < aliens.size(); j++) {
			Alien a = (Alien) aliens.get(j);
			Rectangle r2 = a.getBounds();

			if (r3.intersects(r2)) {
				craft.Visible(false);
				a.Visible(false);
				juego = false;
			}
		}

		ArrayList <Misil> ms = craft.misiles();

		for (int i = 0; i < ms.size(); i++) {
			Misil m = (Misil) ms.get(i);

			Rectangle r1 = m.colisiones();

			for (int j = 0; j < aliens.size(); j++) {
				Alien a = (Alien) aliens.get(j);
				Rectangle r2 = a.getBounds();

				if (r1.intersects(r2)) {
					m.Visible(false);
					a.Visible(false);
					puntaje += 20;
				}
			}
		

			for (int j = 0; j < fuego.size(); j++) {
				Fuego f = (Fuego) fuego.get(j);
				Rectangle r8 = f.getBounds();

				if (r3.intersects(r8)) {
					craft.Visible(false);
					f.Visible(false);
					juego = false;
				}
			}

			for (int j = 0; j < fuego.size(); j++) {
				Fuego f = (Fuego) fuego.get(j);
				Rectangle r9 = f.getBounds();

				if (r1.intersects(r9)) {
					m.Visible(false);
					f.Visible(false);
					puntaje += 20;

				}
			}
		}
	}

	private class Adaptador extends KeyAdapter {

		public void keyReleased(KeyEvent e) {
			craft.keyReleased(e);
		}

		public void keyPressed(KeyEvent e) {
			craft.keyPressed(e);
		}
	}
}